package org.example.rocketmq.msg_type.delay;

import org.apache.commons.lang3.ThreadUtils;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;

import java.time.Duration;
import java.time.LocalTime;

/**
 * 延迟消息的生产者
 * 延迟消息的是实现效果就是在调用 producer.send 方法后，消息并不会立即发送出去，而是会等一段时间再发送出去，这是 RocketMQ 特有的一个功能。
 * message.setDelayTimeLevel(3): 预定日常定时发送。 1 到 18 分别对应 messageDelayLevel = 1s, 5s, 10s, 30s, 1m, 2m, 3m, 4m, 5m, 6m, 7m, 8m, 9m, 10m, 20m, 30m, 1h 2h
 * 可以在 dashboard 中 broker 配置查看。
 * msg.setDelayTimeMs(10L): 指定时间定时发送。默认支持最大延迟时间为 3天，可以根据 broker 配置， timerMaxDelaySec 修改
 */
public class ProducerDelay {

    public static void main(String[] args) throws Exception{
        producer();
    }


    public static void producer() throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("producer_delay_group_01");
        producer.setNamesrvAddr("rocketmq.jun.cn:9876");
        producer.start();

        for (int i = 0; i < 3; i++) {
            Message message = new Message("TopicTest", "TagA", ("Hello RocketMQ Delay" + i + "_step").getBytes(RemotingHelper.DEFAULT_CHARSET));
//            message.setDelayTimeLevel(3);
            message.setDelayTimeMs(1000 * 10); // 10秒后发送
            SendResult result = producer.send(message);

            System.out.printf(LocalTime.now() + "消息发送成功 %s%n", result);
            ThreadUtils.sleep(Duration.ofSeconds(1));
        }

        producer.shutdown();
    }

}
